home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Developer Toolbox 6.1
/
SGI Developer Toolbox 6.1 - Disc 4.iso
/
src
/
haeberli
/
objtools
/
avgnorm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
3KB
|
99 lines
/*
* Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
* the contents of this file may not be disclosed to third parties, copied or
* duplicated in any form, in whole or in part, without the prior written
* permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to restrictions
* as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
* and Computer Software clause at DFARS 252.227-7013, and/or in similar or
* successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
* rights reserved under the Copyright Laws of the United States.
*/
/*
* avgnorm -
* Average the normals of each polygon. This
* will give the object a faceted appearence.
*
* Paul Haeberli - 1990
*/
#include "math.h"
#include "stdio.h"
#include "vect.h"
#include "sgiobj.h"
main(argc,argv)
int argc;
char **argv;
{
sgiobj *obj;
if(argc<3) {
fprintf(stderr,"avgnorm: in.sgo out.sgo\n");
exit(1);
}
obj = readsgiobj(argv[1]);
avgnorm(obj);
writesgiobj(argv[2],obj);
exit(0);
}
avgnorm(obj)
sgiobj *obj;
{
long npolys;
long *data;
char *vertdata, *avert;
int nverts;
vect n;
data = obj->data;
if(obj->objtype == OBJ_QUADLIST) {
npolys = (obj->nlongs/PNTLONGS)/4;
while(npolys--) {
vzero(&n);
vadd(data+(PNTLONGS*0)+OFFSET_NORMAL,&n,&n);
vadd(data+(PNTLONGS*1)+OFFSET_NORMAL,&n,&n);
vadd(data+(PNTLONGS*2)+OFFSET_NORMAL,&n,&n);
vadd(data+(PNTLONGS*3)+OFFSET_NORMAL,&n,&n);
vnormal(&n);
setnorm(&n,data+(PNTLONGS*0)+OFFSET_NORMAL);
setnorm(&n,data+(PNTLONGS*1)+OFFSET_NORMAL);
setnorm(&n,data+(PNTLONGS*2)+OFFSET_NORMAL);
setnorm(&n,data+(PNTLONGS*3)+OFFSET_NORMAL);
data += PNTLONGS*4;
}
} else if(obj->objtype == OBJ_TRILIST) {
npolys = (obj->nlongs/PNTLONGS)/3;
while(npolys--) {
vzero(&n);
vadd(data+(PNTLONGS*0)+OFFSET_NORMAL,&n,&n);
vadd(data+(PNTLONGS*1)+OFFSET_NORMAL,&n,&n);
vadd(data+(PNTLONGS*2)+OFFSET_NORMAL,&n,&n);
vnormal(&n);
setnorm(&n,data+(PNTLONGS*0)+OFFSET_NORMAL);
setnorm(&n,data+(PNTLONGS*1)+OFFSET_NORMAL);
setnorm(&n,data+(PNTLONGS*2)+OFFSET_NORMAL);
data += PNTLONGS*3;
}
} else if(obj->objtype == OBJ_TRIMESH) {
fprintf(stderr,"avgnorm: can't do tmeshes yet\n");
exit(1);
} else {
fprintf(stderr,"avgnorm: bad object type %d\n",obj->objtype);
exit(1);
}
}
setnorm(s,d)
float *s, *d;
{
d[0] = s[0];
d[1] = s[1];
d[2] = s[2];
}